package jukebox.controller;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import jukebox.model.common.CommentVO;
import jukebox.model.common.ListVO;
import jukebox.model.common.PagingBean;
import jukebox.model.member.MemberService;
import jukebox.model.member.MemberVO;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;



@Controller
public class MemberController {
	@Resource(name="memberServiceImpl")
	private MemberService memberService;
	
	private String absPath = "";		// 저장소 root 절대 경로
	private String memberPhotoPath = ""; 	// 회원사진 상대 경로
//	String path="C:\\java-kosta\\jukebox\\jukeboxproject\\WebContent\\profile";
	@Autowired
	public MemberController(ServletContext context){
		absPath = context.getInitParameter("absPath");
		String[] temp = context.getInitParameter("memberPhotoPath").split("/");
		for(int i=0; i<temp.length; i++){
			memberPhotoPath += temp[i] + "\\";
		}
	}
	/**
	* @method : register
	* @author : 김지정
	* @since : 2014-06-23
	* @return : view/member/register.jsp 로 이동
	* @comment : 회원가입 view 보여주는 페이지
	*/
	@RequestMapping("register.ju")
	public String register(){
		return "register.member";
	}
	/**
	* @method : registerMember
	* @author : 김지정, 최민석
	* @since : 2014-06-23 , 30, 07-01
	* @param : mvo - 등록될 회원 정보
	* @return : view/member/register.jsp 로 이동
	* @comment : 회원가입 view 에서 프로필사진을 포함한 회원정보를 받아 저장한다
	*                  ModelAndView 에서 String 으로 바뀜
	 */
	@RequestMapping(value="registerMember.ju", method=RequestMethod.POST)
	public String registerMember(MemberVO mvo){
		System.out.println("registerMember 컨트롤러 : " + mvo);
		MultipartFile mFile = mvo.getFile();
		if(mFile!=null&&!mFile.isEmpty()){
			long now = System.currentTimeMillis();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			mvo.setPicturePath(sdf.format(now) + "_" + mFile.getOriginalFilename());
			System.out.println("picturePath: " + mvo.getPicturePath());
			File copyFile = new File(absPath+memberPhotoPath+mvo.getPicturePath());
			try {
				if(copyFile!=null)
					mFile.transferTo(copyFile);
				System.out.println("file upload ok.." + copyFile.getPath());
			} catch (IllegalStateException | IOException e) {
				e.printStackTrace();
			}
		}else{
			mvo.setPicturePath("default.jpg");
		}
		memberService.registerMember(mvo);
		System.out.println("registerMember ="+mvo);
		return "redirect:registerMemberInfo.ju";
	}
	/**
	* @method : registerMemberInfo
	* @author : 김지정
	* @since : 2014-06-23
	* @return : view/member/registerMemberInfo_view.jsp 로 이동
	* @comment : 컨트롤러의 registerMember 메서드에서
                         return new ModelAndView("redirect:registerMemberInfo.ju"); 로 페이지로 이동시켜준다.
	 */
	@RequestMapping(value="registerMemberInfo.ju")
	public String registerMemberInfo(){
		return "login.member";
	}
	/**
	* @method : dropoutView
	* @author : 김지정
	* @since : 2014-06-24
	* @return : view/member/dropoutMember_view.jsp 로 이동
	* @comment : 회원탈퇴 클릭시 회원탈퇴 페이지로 이동한다. session 에 담긴 정보를 가져와야함.
	 */
	@RequestMapping(value="dropoutMemberView.ju")
	public String dropoutView(){
		return "dropoutMember.member";
	}
	/**
	* @method : dropoutMember
	* @author : 김지정
	* @since : 2014-06-24
	* @return : redirect 로 view/index.jsp 로 이동시킴.
	* @comment : 개인회원 탈퇴기능
	 */
	@RequestMapping("dropoutMember.ju")
	public String dropoutMember(String id,HttpSession session){
		System.out.println("dropoutMember :"+id);
		memberService.dropoutMember(id);
		session.invalidate();
		return "redirect:gohome.ju";
	}
	
	/**
	* @method : dropoutMemberByAdmin
	* @author : 김지정
	* @since : 2014-06-25
	* @return : view/member/memberControl_view.jsp 로 이동
	* @comment : 관리자가 회원을 강제탈퇴 시킨후 회원관리 페이지로 이동
	 */
	@RequestMapping("dropoutMemberByAdmin.ju")
	public String dropoutMemberByAdmin(String id){
		System.out.println("dropoutMemberByAdmin :"+id);
		memberService.dropoutMemberByAdmin(id);
		return "redirect:getAllMemberList.ju?nowPage=1";
	}
	/**
	* @method : updateView
	* @author : 김지정
	* @since : 2014-06-24
	* @return : view/member/update_view.jsp 로 이동
	* @comment : 회원정보 클릭시 회원정보 페이지 이동
	 */
	@RequestMapping(value="updateView.ju")
	public String updateView(){
		System.out.println("updateView");
		return "update.member";
	}
	/**
	 * @method : updateMember
	* @author : 김지정
	* @since : 2014-06-24, 07-04
	* @return : redirect 로 view/index.jsp 로 이동
	* @comment : 회원정보 수정하는 페이지
	 */
	@RequestMapping(value="updateMember.ju", method=RequestMethod.POST)
	public String updateMember(MemberVO mvo,  HttpSession session){
	//	System.out.println("updateMember 넘어옴= "+mvo);
		MultipartFile mFile = mvo.getFile();
		if(!mvo.getFile().isEmpty()){
		//	System.out.println("2");
			System.out.println("나오라 세션="+session);
			System.out.println("나오라 mvo="+mvo);
			if(!mvo.getPicturePath().equals("default.jpg"))
				fileDelete(absPath+memberPhotoPath+mvo.getPicturePath());
				mFile=mvo.getFile();
		}
	//	System.out.println("123");
		File copyFile =null;
		if(mFile!=null&&!mFile.isEmpty()){
			String newPicturepath= System.currentTimeMillis()+"_"+mFile.getOriginalFilename();
			mvo.setPicturePath(newPicturepath);
			System.out.println("updateMember picturePath: " + mvo.getPicturePath());
			copyFile = new File(absPath+memberPhotoPath+newPicturepath);
			try {
				if(copyFile!=null)
					mFile.transferTo(copyFile);
				System.out.println("file upload ok.." + copyFile.getPath());
			} catch (IllegalStateException | IOException e) {
				e.printStackTrace();
			}
		}else{
			mvo.setPicturePath("default.jpg");
		}
		memberService.updateMember(mvo);
		session.setAttribute("mvo", mvo);
	//	System.out.println("registerMember 세션="+mvo);
		return "redirect:gohome.ju";
	}

	/**
	* @method : fileDelete
	* @author : 김지정
	* @since : 2014-07-04
	* @param : filename 
	* @comment : 회원정보수정시에 회원사진변경시 폴더의 기존 사진파일을 지워줌
	 */
	private void fileDelete(String filename) {
		if(filename!=null){
			File file = new File(filename);
			file.delete();
		}
	}
	/**
	* @method : myBoardList
	* @author : 김지정
	* @since : 2014-06-26
	* @return : view/member/myBoardList_view.jsp 로 이동
	* @param : nowPage 
	* @comment : 로그인 후 내 게시글 보기를 클릭하면 본인이 작성한 게시글목록을 볼수 있음.
	 */
	@RequestMapping("myBoardList.ju")
	public ModelAndView myBoardList(HttpSession session,int nowPage){
		System.out.println("컨트롤러 myBoardList nowPage"+nowPage);
		ListVO<MemberVO> list=memberService.myBoardList(nowPage,((MemberVO)session.getAttribute("mvo")).getId());
		System.out.println("컨트롤러 myBoardList : "+list);
		return new ModelAndView ("myBoardList.member","lvo",list);
	}
	/**
	* @method : myqnaBoardListbyId
	* @author : 김지정
	* @since : 2014-06-27
	* @return : view/member/myBoardList_view.jsp 로 이동
	* @param : nowPage 
	* @comment : 로그인 후 내 게시글 보기를 클릭하면 본인이 작성한 게시글목록을 볼수 있음.
	 */
	@RequestMapping("myqnaBoardListbyId.ju")
	public ModelAndView myqnaBoardListbyId(HttpSession session,int nowPage){
	//	System.out.println("컨트롤러 myqnaBoardListbyId nowPage"+nowPage);
		ListVO<MemberVO> list=memberService.myqnaBoardListbyId(nowPage,((MemberVO)session.getAttribute("mvo")).getId());
	//	System.out.println("컨트롤러 myBoardList : "+list);
		return new ModelAndView ("myqnaBoardList.member","lvo",list);
	}
	/**
	* @method : getAllMemberList
	* @author : 김지정
	* @since : 2014-06-25
	* @return : view/member/memberController_view.jsp 로 이동
	* @param : nowPage
	* @comment : 회원관리 권한으로 페이지 번호에 맞는 회원목록을 조회하여 화면 표현
	 */
	@RequestMapping("getAllMemberList.ju")
	public ModelAndView getAllMemberList(int nowPage, PagingBean pb){ 
		System.out.println("컨트롤러 getAllMemberList 넘어옴");
		ListVO list=memberService.getAllMemberList(pb.getNowPage());
		System.out.println("컨트롤러 getAllMemberList : "+list);
		return new ModelAndView("memberControl.member","mvo",list);
	}

	/**
	* @method : checkId
	* @author : 김지정
	* @since : 2014-06-24
	* @param : id - 회원가입시 중복된 회원 아이디 체크
	* @return : ajax 사용
	* @comment : id 중복체크 String-> HashMap 으로 변경함
	 */
	@RequestMapping("checkId.ju")
	@ResponseBody
	public HashMap checkId(String id){
		System.out.println("컨트롤러 아이디 중복 체크 : "+id);
		HashMap map=new HashMap();
		map.put("flag",memberService.checkId(id));
		return map;
	}
	/**
	* @method : checkNickname
	* @author : 김지정
	* @since : 2014-06-24
	* @param : nickname - 회원가입시 중복된 회원 닉네임 체크
	* @return : ajax 사용
	* @comment : 닉네임 중복체크 String-> HashMap 으로 변경함
	 */
	@RequestMapping("checkNickname.ju")
	@ResponseBody
	public HashMap checkNickname(String nickname){
		System.out.println("컨트롤러 닉네임 중복 체크 : "+nickname);
		HashMap map=new HashMap();
		map.put("flag",memberService.checkNickname(nickname));
		return map;
	}
	/**
	* @method : checkPassword
	* @author : 김지정
	* @since : 2014-06-24
	* @param : MemberVO - 회원탈퇴시 Id 와 password 가 같은지 확인
	* @return : ajax 사용
	* @comment : 
	 */
	@RequestMapping("checkPassword.ju")
	@ResponseBody
	public HashMap checkPassword(MemberVO mvo){
		System.out.println("checkPassword : "+mvo);
		HashMap map=new HashMap();
		map.put("flag",memberService.checkPassword(mvo));
		return map;
	}
	/**
	* @method : loginView
	* @author : 김지정
	* @since : 2014-06-24
	* @return : view/member/login_view.jsp 로 이동
	* @comment :로그인페이지로 이동
	 */
	@RequestMapping("loginView.ju")
	public String loginView(){
		return "login.member";
	}
	
	/**
	* @method : login
	* @author : 김지정
	* @since : 2014-06-24
	* @return : 
	* @param : mvo - id 와 password 를 가져와서 로그인
	* @comment :로그인페이지로 이동, 로그인 실패시 loginFail 으로 보내고, 
	*                  로그인 성공시 메인페이지로 이동
	 */
	@RequestMapping(value="login.ju",method=RequestMethod.POST)
	public String login(HttpSession session, MemberVO mvo){
		MemberVO vo=memberService.login(mvo);
		String path="loginFail.member";
		System.out.println("로그인 컨트롤러 : "+ vo);
		if(vo!=null){
			session.setAttribute("mvo", vo);
			path="index";
		}
		System.out.println("login="+vo);
		return path;
	}
	/**
	* @method : logout
	* @author : 김지정
	* @since : 2014-06-24
	* @return : 메인페이지로 이동
	* @comment :로그인페이지로 이동
	 */
	@RequestMapping("logout.ju")
	public String logout(HttpSession session){
		session.invalidate();
		return "index";
	}
	/**
	* @method : findId
	* @author : 김지정
	* @since : 2014-06-24
	* @param : id , mvo - 
	* @return : ajax 사용
	* @comment : 
	 */
	@RequestMapping("findId.ju")
	@ResponseBody
	public MemberVO findId(String id, MemberVO mvo){
		System.out.println("findId : "+id);
		MemberVO vo=memberService.findId(id);
		System.out.println("findId : "+vo);
		return vo;
	}
	/**
	* @method : getRankListByLike()
	* @author : 최민석
	* @since : 2014-07-02
	* @param : 추천수가 1위부터 10위까지의 MemberVO리스트를 가져온다.(작성한 MusicBoard게시글들의 추천수를 합한다.)
	* @return : ajax 사용
	* @comment : 
	 */
	//게시글 추천 수 기준의 랭킹
	// head가 갱신될떄마다 ajax로 갱신 $(docu).ready
	@RequestMapping("member_getRankListByLike.ju")
	@ResponseBody
	public List<MemberVO> getRankListByLike(){
		return memberService.getRankListByLike();
	}
	/**
	* @method : myqnaBoardListbyId
	* @author : 김지정
	* @since : 2014-06-27
	* @return : view/member/myqnaComment_view.jsp 로 이동
	* @param : nowPage 
	* @comment : 로그인 후 내 게시글 보기를 클릭하면 본인이 작성한 게시글목록을 볼수 있음.
	 */
	@RequestMapping("myqnaCommentListbyId.ju")
	public ModelAndView myqnaCommentListbyId(HttpSession session,int nowPage){
		System.out.println("컨트롤러 myqnaBoardListbyId nowPage"+nowPage);
		ListVO list=memberService.myqnaCommentListbyId(nowPage,((MemberVO)session.getAttribute("mvo")).getId());
		System.out.println("컨트롤러 myqnaCommentListbyId : "+list);
		return new ModelAndView ("myqnaComment.member","lvo",list);
	}
	/**
	* @method : myFreeBoardListbyId
	* @author : 김지정
	* @since : 2014-06-27
	* @return : view/member/myqnaComment_view.jsp 로 이동
	* @param : nowPage 
	* @comment : 로그인 후 내 게시글 보기를 클릭하면 본인이 작성한 게시글목록을 볼수 있음.
	 */
	@RequestMapping("myFreeBoardCommentListbyId.ju")
	public ModelAndView myFreeBoardCommentListbyId(HttpSession session,int nowPage){
		System.out.println("컨트롤러 myFreeBoardCommentListbyId nowPage"+nowPage);
		ListVO list=memberService.myFreeBoardCommentListbyId(nowPage,((MemberVO)session.getAttribute("mvo")).getId());
		System.out.println("컨트롤러 myFreeBoardCommentListbyId : "+list);
		return new ModelAndView ("myFreeComment.member","lvo",list);
	}
	/**
	* @method : goHome
	* @author : 김지정
	* @since : 2014-07-04
	* @return : view/index.jsp 로 이동
	* @comment : index로 보내줌
	 */
	@RequestMapping("gohome.ju")
	public String goHome(){
		return "index";	
	}
	
	/**
	* @method :findMyCommentListPerPage
	* @author : 조서영
	* @since : 2014-07-04
	* @return : view/member/myMusicComment_view.jsp 로 이동
	* @param : nowPage 
	* @comment : 본인이 작성한 음악게시판 댓글 리스트보기
	 */
	@RequestMapping("findMyCommentListPerPage.ju")
	public ModelAndView findMyCommentListPerPage(HttpSession session, int nowPage, PagingBean pb) {
		System.out.println("findMyCommentListPerPage_내 뮤직댓글보기");
		ListVO<CommentVO> list=memberService.findMyCommentListPerPage(nowPage,((MemberVO)session.getAttribute("mvo")).getId());
		System.out.println(list);
		return new ModelAndView ("myMusicComment.member","lvo",list);
	}
	/**
	* @method : myBoarList
	* @author : 김지정
	* @since : 2014-07-04
	* @return : view/member/myAllBoardList_view.jsp 로 이동
	* @comment : 로그인 후 내 게시글 보기를 클릭하면 본인이 작성한 게시글 목록을 보여주는 페이지
	 */
	@RequestMapping("myBoarList.ju")
	public String myBoarList(){
		return "myAllBoardList.member";
	}
	/**
	* @method : myMusicList
	* @author : 김지정
	* @since : 2014-07-04
	* @return : view/member/myMusicList_view.jsp 로 이동
	* @param : nowPage , session
	* @comment : 로그인 후 내 게시글 보기를 클릭하면 본인이 작성한 음악 게시글 목록을 볼수 있음.
	 */
	@RequestMapping("myMusicList.ju")
	public ModelAndView myMusicList(HttpSession session,int nowPage){
		System.out.println("컨트롤러 myMusicList / nowPage"+nowPage);
		ListVO list=memberService.getMyMusicContentListById(nowPage,((MemberVO)session.getAttribute("mvo")).getId());
		System.out.println("컨트롤러 myFreeBoardCommentListbyId : "+list);
		return new ModelAndView ("myMusicList.member","lvo",list);
	}
	/**
	* @method : myCommentList
	* @author : 김지정
	* @since : 2014-07-04
	* @return : view/member/myAllCommentList_view.jsp 로 이동
	* @comment : 로그인 후 내 댓글 보기를 클릭하면 본인이 작성한 음악 게시글 목록을 볼수 있음.
	 */
	@RequestMapping("myCommentList.ju")
	public String myCommentList(){
		return "myAllCommentList.member";
	}

}
